package com.exception;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.validation.BindException;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 包含一个或多个如下类型的方法：
 * @ExceptionHandler注解标注的方法；
 * @InitBinder注解标注的方法；
 * @ModelAttribute注解标注的方法。
 */
@ControllerAdvice
@ResponseBody//统一返回字符串形式
public class ExceptionController {

	private static final Logger logger = LoggerFactory.getLogger(ExceptionController.class);

	//处理同一个控制器中所有处理器方法所抛出的异常。
	@ExceptionHandler({DemoException.class})
	public String handleDemoException() {
		return "测试异常";
	}

	//如果 @ExceptionHandler 注解中未声明要处理的异常类型，则默认为参数列表中的异常类型。
	@ExceptionHandler
	public String handleDemoException2(DemoException e) {
		return "test exception";
	}

	@ExceptionHandler
	public String handleDemoException3(Exception e) {
		 /*
         * 参数校验异常
         */
		if (e instanceof BindException) {
			BindingResult bindingResult = ((BindException) e).getBindingResult();
			if (null != bindingResult && bindingResult.hasErrors()) {
				List<Object> jsonList = new ArrayList<>();
				bindingResult.getFieldErrors().stream().forEach(fieldError -> {
					Map<String, Object> jsonObject = new HashMap<>(2);
					jsonObject.put("name", fieldError.getField());
					jsonObject.put("msg", fieldError.getDefaultMessage());
					jsonList.add(jsonObject);
				});
				return "异常为：BindException";
			}
		}
		/**
		 * 系统内部异常，打印异常栈
		 */
		logger.error("Error: handleBadRequest StackTrace : {}", e);
		return "异常为：其他异常";
	}
}
